﻿/*
 * Created by SharpDevelop.
 * User: Usuario
 * Date: 16/10/2011
 * Time: 10:11 p.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using Business_Entity;

namespace DAOFactory
{
	/// <summary>
	/// Description of DAOProducto.
	/// </summary>
	public class DAOProducto
	{
        public DAOProducto() { 
        }
				
		public int registrarProducto(String nombre, String des, int uni, int tipoProd,String marca, String nomOtro, float precio){
			//hay 3 tipos de estado: 0=ERROR, 1=CORRECTO, 2=YA ESTA REGISTRADO
			String cmdSQL;
			SqlDataReader res = null;
            SqlConnection conn = ConnectionManager.getConnection();
            SqlCommand command = null;
            int codigoTipoProd = tipoProd;
            
			if(nomOtro!=""){//Insertar el nuevo tipo de producto
			 	cmdSQL = "INSERT INTO TIPOPRODUCTO (DESCRIPCION, NOMEXTRAS) VALUES ('OTROS', '" + nomOtro + "');";
			 	command = new SqlCommand(cmdSQL, conn);
			 	try{
			 		command.ExecuteNonQuery();
			 	}
			 	catch{
			 		return 0;
			 	}			
            
	            cmdSQL = "SELECT MAX(IDTIPOPRODUCTO) FROM TIPOPRODUCTO;";
	            try{
	            	command = new SqlCommand(cmdSQL, conn);
	            	res = command.ExecuteReader();
	            	while(res.Read()){
	            		codigoTipoProd = Int32.Parse(res[0].ToString());
	            	}
	            	res.Close();
	            }
	            catch{
	            	res.Close();
	            	return 0;
	            }
            }
            
			cmdSQL = "INSERT INTO PRODUCTO (NOMBRE, DESCRIPCION, IDTIPOPRODUCTO, IDUNIDADPRODUCTO, MARCA, ESTADO, PRECIOVENTA) VALUES " +
				"('" + nombre + "', '" + des + "', " + codigoTipoProd + ", " + uni + ", '" + marca + "', 'HABILITADO', " + precio +");";
			
	        command = new SqlCommand(cmdSQL, conn);
				
			try{
				command.ExecuteNonQuery();	
			}
			catch{
				//Si devuelde null es poruqe hubo un error al cargar la lista de pedidos
				return 0;
			}
			return 1;		
		}

		
		public int modificarProducto(int codProd, String nombre, String des, int uni, int tipoProd, String marca, String nomEx, float precio, String nomTipo){
			
			String cmdSQL;
			SqlConnection conn = ConnectionManager.getConnection();
			SqlDataReader res = null;
			SqlCommand command = null;
			
			//verifica si el producto a actualizar fue eliminado por otro vendedor
			cmdSQL = "SELECT ESTADO FROM PRODUCTO WHERE IDPRODUCTO=" + codProd + ";";
			command =  new SqlCommand(cmdSQL, conn);
			res = command.ExecuteReader();
			while(res.Read()){
				if(res[0].ToString() == "ELIMINADO"){
					return 2;//el producto ya fue eliminado, por lo que no puede ser modificado
				}
			}
			res.Close();
			
			cmdSQL = "UPDATE PRODUCTO SET NOMBRE='" + nombre + "', DESCRIPCION='" + des + "', IDUNIDADPRODUCTO=" + uni 
				+ ", MARCA='" + marca + "', IDTIPOPRODUCTO=" + tipoProd + ", PRECIOVENTA=" + precio + " WHERE IDPRODUCTO=" + codProd + ";";
			command =  new SqlCommand(cmdSQL, conn);
			
			
			try{
               	command.ExecuteNonQuery();
               	int tipoProducto = 0;
               	if(nomTipo=="OTROS"){
               		cmdSQL = "SELECT IDTIPOPRODUCTO FROM PRODUCTO WHERE IDPRODUCTO=" + codProd +";";
               		command = new SqlCommand(cmdSQL, conn);
               		try{
               			res = command.ExecuteReader();
               			while(res.Read()){
               				tipoProducto = Int32.Parse(res[0].ToString());
               			}
               			res.Close();
               		}
               		catch{
               			res.Close();               			
						return 0;
               		}
               		cmdSQL = "UPDATE TIPOPRODUCTO SET NOMEXTRAS='" + nomEx + "' WHERE IDTIPOPRODUCTO=" + tipoProducto + ";";
               		command = new SqlCommand(cmdSQL, conn);
               		command.ExecuteNonQuery();
               	}
               	return 1;
			}
			catch{
				return 0;
			}
				
		}
		
		public BEProveedor getProveedorBycod(int cod){
			DAOProveedor prov = new DAOProveedor();
            List<BEProveedor> lista = prov.getProveedores(cod.ToString(), "", "", "");
			return lista[0];
		}
		
		
		public List<BEProducto> getAllProd(){
			String cmdSQL, nomProd, descProd, descTipoProd, unidad, marcProd, nomExtra;
			int cod, codTipoProd, codUni;
			float precioVenta;
			List<BEProducto> lista;
			BETipoProducto tipoProd;
			BEUnidadProducto uniProd;
			BEProducto prod;
			
			
			cmdSQL = "SELECT P.*, U.DESCRIPCION, T.DESCRIPCION, T.NOMEXTRAS FROM PRODUCTO P, TIPOPRODUCTO T, UNIDADPRODUCTO U WHERE ESTADO='HABILITADO' AND P.IDTIPOPRODUCTO=T.IDTIPOPRODUCTO" +
				" AND P.IDUNIDADPRODUCTO=U.IDUNIDADPRODUCTO ORDER BY P.IDPRODUCTO;";
			SqlCommand command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			lista = new List<BEProducto>();
			
			//try{
				SqlDataReader res = command.ExecuteReader();
	            //DAOTipoProducto daoTProd;
	            //daoTProd = new DAOTipoProducto();
				//prod = new BEProducto();
				//Carga el producto obtenido de la búsqueda
				while(res.Read()){
					cod = Int32.Parse(res[0].ToString());
					codTipoProd = Int32.Parse(res[1].ToString());
					nomProd = res[3].ToString();
					descProd = res[2].ToString();
					codUni = Int32.Parse(res[5].ToString());
					marcProd  = res[6].ToString();
					precioVenta = Single.Parse(res[7].ToString());
					unidad = res[8].ToString();
	                descTipoProd = res[9].ToString();
	                nomExtra = res[10].ToString();
	                uniProd = new BEUnidadProducto(codUni, unidad);
					tipoProd = new BETipoProducto(codTipoProd, descTipoProd);
					tipoProd.NombreExtra = nomExtra;
					prod = new BEProducto(cod, nomProd, descProd, uniProd, tipoProd);
					prod.Marca = marcProd;
					prod.PrecioVenta = precioVenta;
					lista.Add(prod);
				}
				res.Close();
			//}
			//catch{
			//}
			return lista;
		}
		
		public BEProveedor getProveedorByRSocial(String rSocial){
            DAOProveedor dao = new DAOProveedor();
            List<BEProveedor> lista = dao.getProveedores("", "", rSocial, "");
			return lista[0];
		}
		
		public int estadoProducto(int codProd){
			//0 si está eliminado, 1 si está habilitado
			SqlConnection conn = ConnectionManager.getConnection();
            String cmdSQL;
            SqlCommand command = null;
            SqlDataReader res = null;
            int aux = 0;
            //verificamos si el producto está asociado a algún pedido de abastecimineto activo
            cmdSQL = "SELECT ESTADO FROM PRODUCTO WHERE IDPRODUCTO=" + codProd + ";"; 
            command = new SqlCommand(cmdSQL, conn);
            try{
            	res = command.ExecuteReader();
            }
            catch{
           		res.Close();
            	return 0;//se presentó un error
            }
            
            while(res.Read()){
            	if(res[0].ToString()=="ELIMINADO"){
            		res.Close();
            		return 0;
            	}
            	else{
            		res.Close();
            		return 1;
            	}
            }
            return 1;
		}
		
		public int eliminarProducto(int codProd){
            
            SqlConnection conn = ConnectionManager.getConnection();
            String cmdSQL;
            SqlCommand command = null;
            SqlDataReader res = null;
            int aux = 0;
            //verificamos si el producto está asociado a algún pedido de abastecimineto activo
            cmdSQL = "SELECT COUNT(*) FROM PEDIDOABASTECIMIENTOLINEA WHERE IDESTADOPEDIDO IN (1,2,3) AND IDPRODUCTO=" + codProd + ";"; 
            command = new SqlCommand(cmdSQL, conn);
            try{
            	res = command.ExecuteReader();
            }
            catch{
            	return 0;//se presentó un error
            }
            
            while(res.Read()){
            	//leemos la cantidad de pedidos en los que está
            	try{
            		aux = Int32.Parse(res[0].ToString());
            	}
            	catch{
            		aux = 0;
            	}
            }
            res.Close();
            
            if(aux==0){            
	            cmdSQL = "UPDATE PRODUCTO SET ESTADO='ELIMINADO' WHERE IDPRODUCTO=" + codProd + ";";
	            command = new SqlCommand(cmdSQL, conn);
	                
	            try{
	                command.ExecuteNonQuery();
	                return 1;//se elimino correctamente
	            }
	            catch {
	                return 0;//no se puedo eliminar por algun error
	            }
            }
            else{
            	return 2;//el producto no puede ser eliminado porque está en un pedido de abastecimiento
            }
		}
		
		public List<BEProducto> searchProducto(int cod, String nom, String tipo, String marca){
			//Este metodo sera llamado cuando se hagan las búsquedas desde la ventana de mantenimiento de productos
			//Se asume que antes de llegar a este paso ya se valido por SQL Injection y la búsqueda considera
			//a alguno de los campos, no se puede llamar este metodo con todos los valore vacios
			String cmdSQL;
			BEProducto prod;
			List<BEProducto> lista;
						
			//Se pone un lock para evitar otros registros pero se permite lecturas
			
			cmdSQL = "SELECT P.*, T.DESCRIPCION, T.NOMEXTRAS, U.DESCRIPCION FROM PRODUCTO P, TIPOPRODUCTO T, UNIDADPRODUCTO U WHERE P.ESTADO='HABILITADO'AND P.IDTIPOPRODUCTO=T.IDTIPOPRODUCTO" +
				" AND U.IDUNIDADPRODUCTO=P.IDUNIDADPRODUCTO";
			if(cod!=0){
				cmdSQL = cmdSQL + " AND P.IDPRODUCTO=" + cod;	
			}
			if(nom!=""){
				cmdSQL = cmdSQL + " AND P.NOMBRE LIKE '%" + nom + "%'";
			}
			if(marca!=""){
				cmdSQL = cmdSQL + " AND P.MARCA LIKE '%" + marca + "%'";
			}
			if(tipo!=""){
				cmdSQL = cmdSQL + " AND T.DESCRIPCION = '" + tipo + "'";
			}
			cmdSQL = cmdSQL + ";";
			SqlCommand command =  new SqlCommand(cmdSQL, ConnectionManager.getConnection());
			SqlDataReader res = null;
			lista = new List<BEProducto>();
			try{
				res = command.ExecuteReader();
				while(res.Read()){
					int codigo = Int32.Parse(res[0].ToString());
					String nombre = res[3].ToString();
					String desc = res[2].ToString();
					String mar = res[6].ToString();
					float precio = Single.Parse(res[7].ToString());
					String uni = res[10].ToString();
					String nomExtraTipo = res[9].ToString();
					int codUni = Int32.Parse(res[5].ToString());
					int codTipo = Int32.Parse(res[1].ToString());
					String descTipo = res[8].ToString();
					BEUnidadProducto uniProd = new BEUnidadProducto(codUni, uni);
					BETipoProducto tip = new BETipoProducto(codTipo, descTipo);
					tip.NombreExtra = nomExtraTipo;
					prod = new BEProducto(codigo, nombre, desc, uniProd, tip);
					prod.PrecioVenta = precio;
					prod.Marca = mar;
					lista.Add(prod);
				}
				res.Close();
			}
			catch{
			}
			
			return lista;
		}
		
		public int eliminaProvDeProducto(int codProv, int codProd){
			SqlTransaction trans;
			
            SqlConnection conn = ConnectionManager.getConnection();
            String cmdSQL = "UPDATE PRODUCTOXPROVEEDOR SET ESTADO='ELIMINADO' WHERE IDPRODUCTO=" + codProd + " AND IDPROVEEDOR=" + codProv + ";";
            SqlCommand command = new SqlCommand(cmdSQL, conn);
            try
            {  
                command.ExecuteNonQuery();
                return 1;//se elimino correctamente
            }
            catch {
                return 0;//no se puedo eliminar por algun error
            }
		}
	}
}
